/* /////////////////////////////////////////////////////////////////////////////
 * File:        NaiveTree.d
 *
 * Purpose:     $B2?$b9)IW$7$J$$J}K!$G%G!<%?%Y!<%9$r<B8=$9$k(B
 *
 * Created      4th June 2007
 * Updated:     7th June 2007
 *
 * www:         http://
 *
 * Copyright (C) 2007 by Yasunobu Imamura
 *
 * This software is provided 'as-is', without any express or implied warranty.
 * In no event will the authors be held liable for any damages arising from the
 * use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not claim
 * that you wrote the original software. If you use this software in a product,
 * an acknowledgment in the product documentation would be appreciated but is
 * not required.
 *
 * 2. Altered source versions must be plainly marked as such, and must not be
 * misrepresented as being the original software.
 *
 * 3. This notice may not be removed or altered from any source distribution. 
 *
 * ////////////////////////////////////////////////////////////////////////// */

module gtree.NaiveTree;

private import gtree.all;

class NaiveTree(T)
	: if_implements!(is(T:ISerializable), ISerializable)
{
	alias NaiveTree!(T) MyType;

	T[] data;
	this()
	{
	}

	static if(is(MyType:ISerializable))
		void serialize(Serializer s)
	{
			s.serialize(&data);
	}

	static if(is(T:IMetrizable))
		void metricSearch(Q)(Q q)
	{
		foreach(o; data)
		{
			q.push(o);
		}
	}

	void insert(T t)
	{
		static if(is(T:ICloneable))
			data ~= t.clone;
		else
			data ~= t;
	}

	void erase(T t)
	{
		for(int i=0; i<data.length; ++i)
		{
			if(data[i]==t)
			{
				data[i] = data[$-1];
				data.length = data.length - 1;
				--i;
			}
		}
	}

	T find(T t)
	{
		foreach(d; data)
		{
			if(t==d)
			{
				static if(is(T:ICloneable))
					return d.clone;
				else
					return d;
			}
		}
	}
}
